李沐dl笔记
vgg
内存占用大,推理慢(深),但效果好
卷积层参数小,全连接层最大问题是参数太大过拟合
所以最后一层全连接是很大的问题
大参数还有内存 bound 的问题
NiN
用卷积层替代全连接
两个 1*1 卷积无 padding, stride1 起全连接的作用(只做通道混合)
每个卷积后面跟两个全连接作为 NiN block
交替使用 NiN 块和 stride = 2 的 maxpooling 逐步减小高宽和增大通道数
最后使用全局平均池化得到输出(通道数 = 分类个数)
打印结构:
for layer in net:
X = layer(X)
print(layer.__class__.__name__, "output shape:\t", X.shape)
超级宽的 hidden layer: 非常容易过拟合
泛化性提高-> 收敛变慢
全连接的方案: 非常强, 收敛很快
GoogLeNet
inception 块: 不做选择, 全都要
output = output1 + o2 + o3 + o4
o1 = conv1x1
o2 = conv1x1 + conv3x3, padding 1
o3 = conv1x1 + conv3x3, padding 1 + conv5x5, padding 2
o4 = 3x3 maxpool, padding 1
四条路径从不同层面抽取信息, 在输出通道合并 concatenation
四条路径分配不同的通道数(你认为那种模式哪个通道的信息更重要)
降低通道数来控制模型复杂度
googlenet 5 段, 9 个 inception 块
不降低维数的 1x1 卷积就是通道融合
第一个 stage 总是把通道数拉上去, 高宽减下去, 先筛选出足够多的特征
v2: batch normalization
v3: 5x5-> 3x3, 5x5-> 1x7+7x1(单长和单宽)
v4: 残差连接
优点是 模型参数少, 计算复杂度低
批量归一化
损失出现在最后, 后面的层训练快
反向传播: loss 在顶层, 数据在最底部, 底部的层(前面的层)训练慢, 底部层一变, 所有都得跟着变
导致离 loss 近的后面层需要重新学习多次, 导致收敛变慢
有没有方法让学习前面层的时候避免变化后面层?
批量归一化: 将分布固定, 来让输出模式稳定一些, 固定小批量的均值和方差
正则化, 将数据分布固定为 正态分布, 数据的修改只是在变化正态分布的超参数, 限制变化不要太剧烈
对于全连接, 作用 在激活函数前面, 作用在特征维度
对卷积, 作用在通道维
效果太好了, 原始论文觉得是减少内部协变量转移, 后续发现 可能就是等效于在每个小批量里面加入噪音来控制模型, 均值近似于随机偏移, 方差近似于随机缩放